package cn.jingyuan.bee.utils.getter;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

/**
 * 基本类型的 getter 接口<br>
 * 提供一个统一的接口定义返回不同类型的值（基本类型）
 */
public interface BasicTypeGetter<K> {

    /**
     * 获取 Object 属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Object getObject(K key);

    /**
     * 获取 String 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    String getString(K key);

    /**
     * 获取 Integer 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Integer getInteger(K key);

    /**
     * 获取 Short 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Short getShort(K key);

    /**
     * 获取 Boolean 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Boolean getBoolean(K key);

    /**
     * 获取 Long 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Long getLong(K key);

    /**
     * 获取 Character 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Character getCharacter(K key);

    /**
     * 获取 Float 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Float getFloat(K key);

    /**
     * 获取 Double 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Double getDouble(K key);

    /**
     * 获取 Byte 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    Byte getByte(K key);

    /**
     * 获取 BigDecimal 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    BigDecimal getBigDecimal(K key);

    /**
     * 获取 BigInteger 型属性值
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    BigInteger getBigInteger(K key);

    /**
     * 获得 Enum 类型的值
     *
     * @param <E> 枚举类型
     * @param clazz Enum 的 Class
     * @param key KEY
     *
     * @return Enum 类型的值，无则返回 Null
     */
    <E extends Enum<E>> E getEnum(Class<E> clazz, K key);

    /**
     * 获取 Date 类型值
     *
     * @param key 属性名
     *
     * @return Date 类型属性值
     */
    Date getDate(K key);

}
